package com.ningxun.pagentcrawler;

import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.ArrayList;

// 导入实体类
import com.ningxun.pagentcrawler.entity.policy.PolicyItem;
import com.ningxun.pagentcrawler.entity.CrawlerConfig;

// 导入服务层
import com.ningxun.pagentcrawler.service.core.impl.CrawlerServiceImpl;
import com.ningxun.pagentcrawler.service.engine.UniversalCrawlerEngine;

// 导入工具类
import com.ningxun.pagentcrawler.util.FileUtil;
import com.ningxun.pagentcrawler.util.CrawlerUtil;

/**
 * 使用Jsoup的爬虫实现
 * 爬取网站数据并保存到数据库
 */
@Component
public class Crawler {

    @Autowired
    private CrawlerServiceImpl crawlerServiceimpl;
    
    @Autowired
    private UniversalCrawlerEngine universalCrawlerEngine;

    // 存储爬取到的数据
    private List<PolicyItem> crawledPolicies = new ArrayList<>();

    // 用于去重，防止重复爬取同一政策
    private java.util.Set<String> urlSet = new java.util.HashSet<>();

    /**
     * 使用Jsoup进行爬虫（主要方法）
     */
    public void runCrawler() {
        runCrawlerAndReturnData();
    }

    /**
     * 执行爬虫并返回数据（供Controller调用）
     */
    public List<PolicyItem> runCrawlerAndReturnData() {
        System.out.println("开始使用Jsoup进行爬虫...");

        // 清空之前的数据和URL集合
        crawledPolicies.clear();
        urlSet.clear();  // 修复：清空URL集合，确保每次都能重新爬取

        // 配置SSL证书验证忽略
        CrawlerUtil.configureSSL();

        // 使用Jsoup爬取多页网站数据
        CrawlerUtil.crawlMultiplePagesWithJsoup(crawledPolicies, urlSet);
        
        // 同时保存到文件作为备份
        if (!crawledPolicies.isEmpty()) {
            FileUtil.saveCrawlerResult(crawledPolicies);
            System.out.println("✅ 爬虫完成，共获取到 " + crawledPolicies.size() + " 条数据");
        } else {
            System.out.println("⚠️ 未能爬取到任何数据");
        }
        
        // 返回爬取到的数据（让Controller决定是否保存到数据库）
        return new ArrayList<>(crawledPolicies);
    }
    
    /**
     * 使用配置执行爬虫（新增方法）
     */
    public List<PolicyItem> runCrawlerWithConfig(CrawlerConfig config) {
        System.out.println("开始使用配置执行爬虫: " + config.getConfigName());
        
        // 使用通用爬虫引擎执行爬虫
        List<PolicyItem> policies = universalCrawlerEngine.crawlWithConfig(config);
        
        // 同时保存到文件作为备份
        if (!policies.isEmpty()) {
            FileUtil.saveCrawlerResult(policies);
            System.out.println("✅ 配置化爬虫完成，共获取到 " + policies.size() + " 条数据");
        } else {
            System.out.println("⚠️ 未能爬取到任何数据");
        }
        
        return policies;
    }
}